package org.cybzacg.encryption.context;

import org.cybzacg.encryption.config.EncryptionConfig;
import org.cybzacg.encryption.enums.EncryptionType;
import org.cybzacg.encryption.enums.EncryptionAlgorithm;
import org.cybzacg.encryption.enums.SecurityStrategyEnum;

import java.time.LocalDateTime;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 加密上下文接口
 * 提供加密操作所需的配置和状态信息
 * 
 * @author encryption team
 * @version 1.0
 */
public interface EncryptionContext {
    
    /**
     * 获取加密配置
     * 
     * @return 加密配置
     */
    EncryptionConfig getConfig();
    
    /**
     * 获取加密类型
     * 
     * @return 加密类型
     */
    EncryptionType getEncryptionType();
    
    /**
     * 获取加密算法
     * 
     * @return 加密算法
     */
    EncryptionAlgorithm getAlgorithm();
    
    /**
     * 获取安全策略
     * 
     * @return 安全策略
     */
    SecurityStrategyEnum getSecurityStrategy();
    
    /**
     * 获取密钥
     * 
     * @return 密钥
     */
    byte[] getKey();
    
    /**
     * 获取初始化向量
     * 
     * @return 初始化向量，可能为null
     */
    byte[] getIv();
    
    /**
     * 获取公钥（用于非对称加密）
     * 
     * @return 公钥，可能为null
     */
    byte[] getPublicKey();
    
    /**
     * 获取私钥（用于非对称加密）
     * 
     * @return 私钥，可能为null
     */
    byte[] getPrivateKey();
    
    /**
     * 获取上下文属性
     * 
     * @param key 属性键
     * @return 属性值
     */
    Object getAttribute(String key);
    
    /**
     * 设置上下文属性
     * 
     * @param key 属性键
     * @param value 属性值
     */
    void setAttribute(String key, Object value);
    
    /**
     * 获取所有属性
     * 
     * @return 属性映射
     */
    Map<String, Object> getAttributes();
    
    /**
     * 获取创建时间
     * 
     * @return 创建时间
     */
    LocalDateTime getCreateTime();
    
    /**
     * 获取上下文ID
     * 
     * @return 上下文ID
     */
    String getContextId();
    
    /**
     * 检查是否为批处理模式
     * 
     * @return 是否为批处理模式
     */
    boolean isBatchMode();
    
    /**
     * 设置批处理模式
     * 
     * @param batchMode 批处理模式
     */
    void setBatchMode(boolean batchMode);
    
    /**
     * 获取批次大小
     * 
     * @return 批次大小
     */
    int getBatchSize();
    
    /**
     * 设置批次大小
     * 
     * @param batchSize 批次大小
     */
    void setBatchSize(int batchSize);
    
    /**
     * 检查是否启用缓存
     * 
     * @return 是否启用缓存
     */
    boolean isCacheEnabled();
    
    /**
     * 设置缓存启用状态
     * 
     * @param cacheEnabled 是否启用缓存
     */
    void setCacheEnabled(boolean cacheEnabled);
    
    /**
     * 获取超时时间（毫秒）
     * 
     * @return 超时时间
     */
    long getTimeout();
    
    /**
     * 设置超时时间（毫秒）
     * 
     * @param timeout 超时时间
     */
    void setTimeout(long timeout);
    
    /**
     * 创建上下文的副本
     * 
     * @return 上下文副本
     */
    EncryptionContext copy();
    
    /**
     * 验证上下文的有效性
     * 
     * @return 是否有效
     */
    boolean isValid();
    
    /**
     * 获取上下文摘要信息
     * 
     * @return 摘要信息
     */
    String getSummary();
}
